package com.huilian.iotbox.data.cmd;

import com.huilian.iotbox.data.constants.IotConstant;
import com.huilian.iotbox.data.utils.IotBoxUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.StringUtils;

/**
 * PositiveDataFrameCMD
 * 主动下发数据帧
 *
 * @Author mineChen
 * @Date 2021/8/30 下午 03:31
 */
@Slf4j
public class PositiveDataFrameCMD {

    /**
     * 23.1、服务器和外部设备数据进行透传（服务器to支付盒子）
     *
     * @param data 透传指令
     * @return
     */
    public static String penetrate(String data) {
        StringBuilder stringBuilder = new StringBuilder(IotConstant.CONTENT_PREFIX);
        StringBuilder dataPrefix = new StringBuilder(IotBoxUtil.singleInt2Hex(data.length() / 2 + 3)).append("0026");
        final StringBuilder dataAre = dataPrefix
                .append(data);

        stringBuilder
                .append(dataAre)
                .append(IotBoxUtil.checkcode_0007(dataAre.toString()))
                .append(IotConstant.CONTENT_SUFFIX);
        return stringBuilder.toString().toUpperCase();
    }



    /**
     *
     * @param data 透传指令
     * @return
     */
    public static String penetrate32(Integer positionId, String data) {
        StringBuilder stringBuilder = new StringBuilder(IotConstant.CONTENT_PREFIX);
        StringBuilder dataPrefix = new StringBuilder(IotBoxUtil.singleInt2Hex(data.length() / 2 + 4)).append("0032");
        final StringBuilder dataAre = dataPrefix
                .append(IotBoxUtil.singleInt2Hex(positionId))
                .append(data);

        stringBuilder
                .append(dataAre)
                .append(IotBoxUtil.checkcode_0007(dataAre.toString()))
                .append(IotConstant.CONTENT_SUFFIX);
        return stringBuilder.toString().toUpperCase();
    }
    /**
     * 24.1、设置向外投币电平（服务器to支付盒子）
     *
     * @param data 0x00--常开(输出高电平，设备掉电保存)
     *             0x01--常闭(输出低电平，设备掉电保存)
     *             0x02--输出高电平，设备掉电不保存(外接继电器断开) (断开)
     *             0x03--输出低电平，设备掉电不保存(外接继电器闭合) (通电)
     * @return
     */
    public static String setOutwardCoinLevel(String data) {
        StringBuilder stringBuilder = new StringBuilder(IotConstant.CONTENT_PREFIX);
        StringBuilder dataPrefix = new StringBuilder("040027").append(data);
        stringBuilder
                .append(dataPrefix)
                .append(IotBoxUtil.checkcode_0007(dataPrefix.toString()))
                .append(IotConstant.CONTENT_SUFFIX);
        return stringBuilder.toString().toUpperCase();
    }

    /**
     * 25.1、设置通讯串口（服务器to支付盒子）
     *
     * @param baudRate  波特率
     * @param dataCode  数据位   0x05：5
     *                  0x06：6
     *                  0x07：7
     *                  0x08：8（默认）
     * @param checkCode 0x00：None无（默认）
     *                  0x01：Odd奇数
     *                  0x02：Even偶数
     * @param stopCode  0x00：1位（默认）
     *                  0x01：1.5位
     *                  0x02：2位
     * @param flag      0x00：关闭，0x01：开启
     * @return
     */
    public static String setSerialPort(int baudRate, int dataCode, int checkCode, int stopCode, boolean flag) {
        StringBuilder stringBuilder = new StringBuilder(IotConstant.CONTENT_PREFIX);
        StringBuilder dataPrefix = new StringBuilder("0B0028");
        final StringBuilder dataAre = dataPrefix
                .append(IotBoxUtil.reverseHex(IotBoxUtil.singleInt2Hex_2(baudRate, 4)))
                .append(IotBoxUtil.singleInt2Hex(dataCode))
                .append(IotBoxUtil.singleInt2Hex(checkCode))
                .append(IotBoxUtil.singleInt2Hex(stopCode))
                .append(IotBoxUtil.singleInt2Hex(flag ? 1 : 0));

        stringBuilder
                .append(dataAre)
                .append(IotBoxUtil.checkcode_0007(dataAre.toString()))
                .append(IotConstant.CONTENT_SUFFIX);
        return stringBuilder.toString().toUpperCase();
    }

    /**
     * 26.1、查询支付盒子参数（服务器to支付盒子）
     *
     * @return
     */
    public static String boxParamsQuery() {
        StringBuilder stringBuilder = new StringBuilder(IotConstant.CONTENT_PREFIX);
        StringBuilder dataPrefix = new StringBuilder("030029");
        stringBuilder
                .append(dataPrefix)
                .append(IotBoxUtil.checkcode_0007(dataPrefix.toString()))
                .append(IotConstant.CONTENT_SUFFIX);
        return stringBuilder.toString().toUpperCase();
    }

    /**
     * 29.1、设置脉冲（服务器to支付盒子）
     *
     * @param heartTime                   心跳时间
     * @param pulseSeparationByInsertCoin 投币脉冲间隔
     * @param pulseWidthByInsertCoin      投币脉冲宽度
     * @param lotteryPattern              彩票模式
     * @param pulseSeparationByChuLi      处理脉冲间隔
     * @param pulseWidthByChuLi           出礼脉冲宽度
     * @return
     */
    public static String setPulse(int heartTime, int pulseSeparationByInsertCoin, int pulseWidthByInsertCoin, int lotteryPattern, int pulseSeparationByChuLi, int pulseWidthByChuLi) {
        /**
         * AA130030 1E32001E000132001E00000000000000 3CDD
         *
         * 1E
         * 3200
         * 1E00
         * 01
         * 3200
         * 1E00
         * 000000000000
         */
        StringBuilder stringBuilder = new StringBuilder(IotConstant.CONTENT_PREFIX);
        StringBuilder dataPrefix = new StringBuilder("130030")
                .append(IotBoxUtil.singleInt2Hex(heartTime))
                .append(IotBoxUtil.reverseHex(IotBoxUtil.singleInt2Hex_2(pulseSeparationByInsertCoin, 2)))
                .append(IotBoxUtil.reverseHex(IotBoxUtil.singleInt2Hex_2(pulseWidthByInsertCoin, 2)))
                .append(IotBoxUtil.singleInt2Hex(lotteryPattern))
                .append(IotBoxUtil.reverseHex(IotBoxUtil.singleInt2Hex_2(pulseSeparationByChuLi, 2)))
                .append(IotBoxUtil.reverseHex(IotBoxUtil.singleInt2Hex_2(pulseWidthByChuLi, 2)))
                .append("000000000000");
        stringBuilder
                .append(dataPrefix)
                .append(IotBoxUtil.checkcode_0007(dataPrefix.toString()))
                .append(IotConstant.CONTENT_SUFFIX);
        return stringBuilder.toString().toUpperCase();
    }

    public static void main(String[] args) {
    }
    //------------------------------------------以下为透传指令--------------------------------------------------


    /**
     * 5.1、查询基础参数（服务器to支付盒子）
     *
     * @return
     */
    public static String queryBaseParams() {
        StringBuilder stringBuilder = new StringBuilder(IotConstant.CONTENT_PREFIX);
        StringBuilder dataPrefix = new StringBuilder("030105");
        stringBuilder
                .append(dataPrefix)
                .append(IotBoxUtil.checkcode_0007(dataPrefix.toString()))
                .append(IotConstant.CONTENT_SUFFIX);
        return stringBuilder.toString().toUpperCase();
    }
}
